// 知识点1：当我们不能（或者不希望）使用模版版本时，我们可以定义类模版或者函数模版的一个特例化版本：比如说函数模版中的处理不适用于未定义<运算符（指针类型）的情况，我们就可以特例化一个版本已使用特殊情况

// 知识点2：一个特例化版本就是模版的一个独立的定义，在其中一个或者多个参数被特定为指定的类型

// 知识点3：在为函数模版特例化时，必须为函数模版的每个模版参数提供实参，尖括号中的模版参数去掉，但是必须提供实参

// template <> int compare(const int&p1, const int&p2)
// {
//
// }

// 知识点4：特例化的本质是实例化一个模版，而非重载，因此特例化不影响函数的重载，它不是一个非模版的独立函数

// 知识点5：模版及其特例化版本应该定义在一个头文件中，所有同名的模版的声明应该放在前面，然后是这些特例化的声明

// 知识点6：类模版也可以进行特例化，需要在原模版定义所在的命名空间中特例化，本节用例：hash模版所在命名空间为标准库std，所以我们可以打开标准空间对该命名空间添加成员：
#include "ex16_62.h"
#include <memory>
#include <unordered_set>

int main() {
  //! test for ex16.62
  std::unordered_multiset<Sales_data> mset;
  Sales_data sd("Bible", 10, 0.98);

  mset.emplace(sd);
  mset.emplace("C++ Primer", 5, 9.99);

  for (const auto &item : mset)
    std::cout << "the hash code of " << item.isbn() << ":\n0x" << std::hex
              << std::hash<Sales_data>()(item) << "\n";
  system("pause");
  return 0;
}